
#ifndef _TTG_MATH_VEC3X_
#define _TTG_MATH_VEC3X_
#include "Common/Definitions.h"

#include "vec3.h"
#include "vec4.h"

namespace ttg
{
	namespace math
	{
		typedef vec3<float> vec3f;
		//class vec3f :public vec3<float>
		//{
		//	public:
		//		inline vec3f()
		//			:vec3<float>()
		//				{ /*nothing*/ }

		//		inline vec3f(const vec3<float> &vec)
		//			:vec3<float>(vec)
		//				{ /*nothing*/ }

		//		inline vec3f(const vec4<float> &vec)
		//			:vec3<float>(vec)
		//				{ /*nothing*/ }

		//#ifdef MICROSOFT_DIRECTX

		//		inline vec3f(const D3DXVECTOR3 &vec)
		//			:vec3<float>(vec)
		//				{ /*nothing*/ }

		//		inline vec3f(const D3DXVECTOR4 &vec)
		//			:vec3<float>(vec)
		//				{ /*nothing*/ }

		//#endif

		//#ifdef NVIDIA_PHYSX

		//		inline vec3f(const NxVec3 &vec)
		//			:vec3<float>(vec)
		//				{ /*nothing*/ }

		//#endif

		//		inline vec3f(float x, float y, float z)
		//			:vec3<float>(x, y, z)
		//				{ /*nothing*/ }

		//		inline vec3f(int x, int y, int z)
		//			:vec3<float>((float)x, (float)y, (float)z)
		//				{ /*nothing*/ }

		//		inline operator vec3<double>() const
		//		{
		//			return vec3<double>(x, y, z);
		//		}
		//		static const vec3f ZERO;
		//		static const vec3f DEFAULT_DIRECTION;
		//};

		//Version of vec3f without virtual table.
		struct optimized_vec3f
		{
			public:
				float x, y, z;

				inline optimized_vec3f(const vec3<float> &vec)
				{
					this->x = vec.x;
					this->y = vec.y;
					this->z = vec.z;
				}

				inline optimized_vec3f(float x, float y, float z)
				{
					this->x = x;
					this->y = y;
					this->z = z;
				}

				inline operator vec3<float>()
				{
					return vec3<float>(x, y, z);
				}
		};

		typedef vec3<double> vec3d;
		//class vec3d :public vec3<double>
		//{
		//	public:
		//		inline vec3d()
		//			:vec3<double>()
		//				{ /*nothing*/ }

		//		inline vec3d(const vec3<double> &vec)
		//			:vec3<double>(vec)
		//				{ /*nothing*/ }

		//		inline vec3d(const vec4<double> &vec)
		//			:vec3<double>(vec)
		//				{ /*nothing*/ }

		//#ifdef MICROSOFT_DIRECTX

		//		inline vec3d(const D3DXVECTOR3 &vec)
		//			:vec3<double>(vec)
		//				{ /*nothing*/ }

		//#endif

		//#ifdef NVIDIA_PHYSX

		//		inline vec3d(const NxVec3 &vec)
		//			:vec3<double>(vec)
		//				{ /*nothing*/ }

		//#endif

		//		inline vec3d(double x, double y, double z)
		//			:vec3<double>(x, y, z)
		//				{ /*nothing*/ }

		//		inline operator vec3<float>() const
		//		{
		//			return vec3<float>((float)x, (float)y, (float)z);
		//		}
		//	static const vec3d ZERO;
		//	static const vec3d DEFAULT_DIRECTION;
		//};
	}
}

#endif
